package com.nys.conci.base.utilitario;

import com.nys.conci.base.utilitario.JSFUtil;
import com.nys.conci.base.utilitario.UTF8;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;

/**
 * Clase Utilitaria, que contiene los métodos para realizar el despliegue de
 * errores en la aplicación. Contiene procedimientos para cada uno de los
 * posibles distintos tipos de mensajes a desplegar ERROR, INFO, WARN, FATAL,
 * además de los distintos lugar en donde mostrar dichos mensajes, Globalmente o
 * el mensaje va a un componente en específico.
 *
 *
 * @author Adam M. Gamboa González
 * @since
 */
public class MensajeUtil {

    /**
     * Enumerado con los diferentes Niveles de mensaje utilizados en la aplicación.
     */
    public enum TipoMensaje {

        ADVERTENCIA(FacesMessage.SEVERITY_WARN, "Advertencia"),
        ERROR(FacesMessage.SEVERITY_ERROR, "Error"),
        FATAL(FacesMessage.SEVERITY_FATAL, "Error Fatal"),
        INFORMACION(FacesMessage.SEVERITY_INFO, "Información");
        public FacesMessage.Severity severidad;
        public String nombre;

        TipoMensaje(FacesMessage.Severity s, String n) {
            this.severidad = s;
            this.nombre = n;
        }
    }

    /**
     * Agrega un mensaje de tipo ERROR, a la cola de faces, para ser mostrado
     * por alguno de los componentes &lt;p:messages/> en la pantalla.
     *
     * @param msg Mensaje de error a desplegar.
     */
    public static void agregarMensajeError(String msg) {
        agregarMensaje(null, msg, MensajeUtil.TipoMensaje.ERROR);
    }

    /**
     * Agrega un mensaje de tipo INFORMACION, a la cola de faces, para ser
     * mostrado por alguno de los componentes &lt;p:messages/> en la pantalla.
     *
     * @param msg Mensaje de informativo a desplegar.
     */
    public static void agregarMensajeInfo(String msg) {
        agregarMensaje(null, msg, MensajeUtil.TipoMensaje.INFORMACION);
    }

    /**
     * Agrega un mensaje de tipo Advertencia, a la cola de faces, para ser
     * mostrado por alguno de los componentes &lt;p:messages/> en la pantalla.
     *
     * @param msg Mensaje de advertencia a desplegar.
     */
    public static void agregarMensajeAdvertencia(String msg) {
        agregarMensaje(null, msg, MensajeUtil.TipoMensaje.ADVERTENCIA);
    }

    /**
     * Agrega un mensaje de tipo FATAL, a la cola de faces, para ser mostrado
     * por alguno de los componentes &lt;p :messages /> en la pantalla.
     *
     * @param msg Mensaje de error fatal a desplegar.
     */
    public static void agregarMensajeFatal(String msg) {
        agregarMensaje(null, msg, MensajeUtil.TipoMensaje.FATAL);
    }

    /**
     * Agrega un mensaje de error por componente
     * @param componente String
     * @param msg String
     */
    public static void agregarMensajeErrorComponente(String componente, String msg) {
        agregarMensaje(componente, msg, MensajeUtil.TipoMensaje.ERROR);
        UIInput c = (UIInput) JSFUtil.obtenerComponente(componente);
        if (c != null) {
            c.setValid(false);
        }
    }
    
    /**
     * Activa el color de un componentes especifico
     * @param componente String    
     */
    public static void agregarFocusComponente(String componente) {        
        UIInput c = (UIInput) JSFUtil.obtenerComponente(componente);
        if (c != null) {
            c.setValid(false);
        }
    }    
    /**
     * Agrega un mensaje de error por componente
     * @param componentes String[]
     * @param msg String
     */
    public static void agregarMensajeErrorComponente(String componentes[], String msg) {
        agregarMensaje(null, msg, MensajeUtil.TipoMensaje.ERROR);
        if (componentes != null) {
            for (String componente : componentes) {
                if (componente != null){
                    UIInput c = (UIInput) JSFUtil.obtenerComponente(componente);
                    if (c != null) {
                        c.setValid(false);
                    }
                }
            }
        }
    }
    /**
    * Agrega de un mensaje de informacion
    * @param componente String
    * @param msg  String
    */
    public static void agregarMensajeInfoComponente(String componente, String msg) {
        agregarMensaje(componente, msg, MensajeUtil.TipoMensaje.INFORMACION);
        UIInput c = (UIInput) JSFUtil.obtenerComponente(componente);
        if (c != null) {
            c.setValid(true);
        }
    }
    /**
    * Agrega de un mensaje de advertencia
    * @param componente String
    * @param msg  String
    */
    public static void agregarMensajeAdvertenciaComponente(String componente, String msg) {
        agregarMensaje(componente, msg, MensajeUtil.TipoMensaje.ADVERTENCIA);
        UIInput c = (UIInput) JSFUtil.obtenerComponente(componente);
        if (c != null) {
            c.setValid(false);
        }
    }
    /**
    * Agrega de un mensaje de advertencia a un componente
    * @param componentes String[]
    * @param msg  String
    */
    public static void agregarMensajeAdvertenciaComponente(String componentes[], String msg) {
        agregarMensaje(null, msg, MensajeUtil.TipoMensaje.ADVERTENCIA);
        if (componentes != null) {
            for (String componente : componentes) {
                UIInput c = (UIInput) JSFUtil.obtenerComponente(componente);
                if (c != null) {
                    c.setValid(false);
                }
            }
        }
    }
    /**
    * Agrega de un mensaje fatal a un componente
    * @param componente String
    * @param msg  String
    */
    public static void agregarMensajeFatalComponente(String componente, String msg) {
        agregarMensaje(componente, msg, MensajeUtil.TipoMensaje.FATAL);
        UIInput c = (UIInput) JSFUtil.obtenerComponente(componente);
        if (c != null) {
            c.setValid(true);
        }
    }
    /**
    * Agrega de un mensaje fatal a un componente
    * @param componentes String[]
    * @param msg  String
    */
    public static void agregarMensajeFatalComponente(String componentes[], String msg) {
        agregarMensaje(null, msg, MensajeUtil.TipoMensaje.FATAL);
        if (componentes != null) {
            for (String componente : componentes) {
                UIInput c = (UIInput) JSFUtil.obtenerComponente(componente);
                if (c != null) {
                    c.setValid(true);
                }
            }
        }
    }

    /**
     * Utiliza el FacesContex para desplegar un mensaje en un objeto de la UI
     *
     * @param id identificador del objeto
     * @param mensaje mensaje a mostrar
     * @param severity severidad del mensaje
     */
    private static void agregarMensaje(String id, String mensaje, MensajeUtil.TipoMensaje tipo) {
        String msj = UTF8.aUTF8(mensaje);
        FacesContext context = FacesContext.getCurrentInstance();
        FacesMessage fm = crearFacesMessage(tipo, mensaje);
        context.addMessage(id, fm);
    }
    
    /**
    /**
     * Método encargado de crear un FacesMessage que será desplegado en la aplicación.
     * @param tipo Tipo de Mensaje
     * @param mensaje Texto del mensaje
     * @return FacesMessage Creado
     */
    public static FacesMessage crearFacesMessage(MensajeUtil.TipoMensaje tipo, String mensaje){
        return new FacesMessage(tipo.severidad, tipo.nombre, mensaje);
    }
 /**
     * Metodo encargado de marcar en rojo el campo dado.
     * @param componente 
     */
    public static void marcarEnRojo(String componente){
        UIInput c = (UIInput) JSFUtil.obtenerComponente(componente);
        if (c != null) {
            c.setValid(false);
        }
    }
    /**
     * Metodo que se encarga de marcar en rojo los campos dados en el arreglo.
     * @param componentes 
     */
    public static void marcarEnRojo(String componentes[]){
        
        for (String componente : componentes) {
            UIInput c = (UIInput) JSFUtil.obtenerComponente(componente);
            if (c != null) {
                c.setValid(false);
            }
        }
    }
}
